﻿#region Copyright

// // The contents of this file are subject to the Mozilla Public License
// // Version 1.1 (the "License"); you may not use this file except in compliance
// // with the License. You may obtain a copy of the License at
// //   
// // http://www.mozilla.org/MPL/
// //   
// // Software distributed under the License is distributed on an "AS IS"
// // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
// // License for the specific language governing rights and limitations under 
// // the License.
// //   
// // The Initial Developer of the Original Code is Robert Smyth.
// // Portions created by Robert Smyth are Copyright (C) 2008-2013.
// //   
// // All Rights Reserved.

#endregion

using System;
using NoeticTools.NWorkflow.Scopes;


namespace NoeticTools.NWorkflow
{
    public interface ICompositeStepRulesScope<TResult, TStepResult> : IDisposable
    {
        /// <summary>
        ///     On entering the workflow step.
        /// </summary>
        ActionScope<TResult, TStepResult> OnEntry { get; }

        /// <summary>
        ///     On leaving the workflow step.
        /// </summary>
        ActionScope<TResult, TStepResult> OnLeaving { get; }

        ActionScope<TResult, TStepResult> OnTimeout { get; }
        ActionScope<TResult, TStepResult> OnAnyUnhandledResult { get; }
        ActionScope<TResult, TStepResult> OnResult(TStepResult result);

        void ExitWithAnyResult<T>()
            where T : TStepResult, TResult;

        /// <summary>
        ///     On progress percentage change delta.
        /// </summary>
        ActionScope<TResult, TStepResult> OnProgress(double percentageDelta);

        ActionScope<TResult, TStepResult> OnEvent<TEvent>(TEvent eventValue);
    }
}